package com.fengkai.filepost.pdfoutstream.test.ODsolutions;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.TreeMap;

/**
 * @author Fengkai
 * @creat 2023/4/8 0008
 * 输入描述:
 * 第一行输入一个由大小写字母组成的字符串
 * 第二行输入 k，k 必须大于 0，k 可以大于输入字符串的长度
 * 输出描述:
 * 输出字符串中第 k 个最小 ascii 码值的字母所在字符串的位置索引。k 如果大于字符串长度，则输出最大 ascii 值的字母所在字符串的位置索引，如果第 k 个最小 ascii 码值的字母存在重复，则输出该字母的最小位置索引。
 */
public class FindMinKIndexString {
    public static void main (String[] args) {
        for (int i = 0; i < 500; i++) {
            String string = FindLogesetStr.getString();
            int v = (int) (Math.random() * 65535 + 1);
            long l = System.currentTimeMillis();
            getMinKIndex(string, v);
            long e = System.currentTimeMillis();
            long s1 = e -l;

            long l1 = System.currentTimeMillis();
            anotherMethod(string, v);
            long e1 = System.currentTimeMillis();
            long s2 = e1 -l1;
            System.out.println("耗时：" + s1 + "=====" + s2);

        }
    }



    public static int getMinKIndex (String input, int k) {
        TreeMap<Integer, List<Integer>> asciiIndex = new TreeMap<>();
        for (int i = 0; i < input.length(); i++) {
            int key = input.charAt(i);
            List<Integer> orDefault = asciiIndex.getOrDefault(key, new ArrayList<>());
            orDefault.add(i);
            asciiIndex.put((int) input.charAt(i), orDefault);
        }
        int result = 0;
        if (k > input.length()) {
            result = asciiIndex.lastEntry().getValue().get(0);
        } else {
            out:
            while (k != 0) {
                List<Integer> value = asciiIndex.pollFirstEntry().getValue();
                for (int i = 0; i < value.size(); i++) {
                    result = value.get(0);
                    k--;
                    if (k == 0) {
                        break out;
                    }
                }
            }
        }
        return result;
    }


    public static int anotherMethod(String input, int k ){
        char[] chars = input.toCharArray();
        Arrays.sort(chars);
        int result = 0;
        if (k > chars.length) {
            result = input.indexOf(chars[input.length() - 1]);
        }else {
            result = input.indexOf(chars[k-1]);
        }
        return result;
    }
}
